
/**
 * @author Administrator
 * @date 2019年4月23日
 */
package com.study.annotation;

/**
 * 
 * 一 生成Class对象的三种方式
　　1 Class.forName("全路径名")
　　2 类名.Class
　　3 实例对象.getClass()
 * <p>
 * 三种方式生成Class对象的区别测试 说明:测试一、二、三可屏蔽代码分开进行看输出结果
 * 结论：
1 类名.class(也称类字面常量)  方式生成Class对象不会初始化的静态块，不会初始化参数，不会调用构造函数
2 Class.forName()方式生成Class对象会初始化类静态块，但不会初始化非静态的代码块，也不调用构造函数
3 Object.getClass()方式生成Class对象会先初始化静态块，接着执行非静态块的初始化，最后调用构造函数
 * </p>
 */


public class ClassDemo {

	public static void main(String[] args)

	{

		try {

			/*
			 * 测试一 测试类名.class 输出为： testTypeClass---class
			 * com.shangcg.reflect.AnyOneObject 没有执行构造函数没有执行静态块
			 */

			Class<?> testTypeClass = AnyOneObject.class;

			System.out.println("testTypeClass---" + testTypeClass);

			/*
			 * 测试二 测试Class.forName() 输出为: ---静态的参数初始化--- 说明执行静态块
			 * testForName---class com.shangcg.reflect.AnyOneObject
			 */

			Class<?> anyOneTypeForName = Class.forName("com.study.annotation.AnyOneObject");

			System.out.println("testForName---" + anyOneTypeForName);

			/*
			 * 测试三 测试Object.getClass() 输出： ---静态的参数初始化--- 执行静态块 ----非静态的参数初始化---
			 * 执行非静态块初始化 ----构造函数--- 执行构造函数 testGetClass---class
			 * com.shangcg.reflect.AnyOneObject
			 */
			AnyOneObject testGetClass = new AnyOneObject();

			System.out.println("testGetClass---" + testGetClass.getClass());

		} catch (Exception e) {

			e.printStackTrace();

		}

	}

}

class AnyOneObject {

	// 构造函数

	public AnyOneObject() {

		System.out.println("----构造函数---");

	}

	// 静态的参数初始化

	static {

		System.out.println("---静态的参数初始化---");

	}

	// 非静态的参数初始化

	{

		System.out.println("----非静态的参数初始化---");

	}
}